/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Devolucion;

import Ventas.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

import javax.swing.table.DefaultTableModel;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/**
 *
 * @author nan
 */
public class MedDevolucion implements ActionListener, KeyListener{
    private GUIDevolucion unaVent = new GUIDevolucion();
    private Conexion.ConexionBD conectar = new Conexion.ConexionBD();
    String[] titulos = {"Cod", "Nombre", "Marca", "Descrip", "Cantidad", "$ Costo","$  Sub Total"};
    Object[][] datos = {};
    private DefaultTableModel dtmArticulos;
    private double total = 0;
    private int cantidad = 0;
    String tipopago;
    private String nombreUser;
    private boolean bandera = false;
    private Administracion.AdministracionMediador admin;
    private double porsentaje = 0;

    public MedDevolucion(String nombreuser,Administracion.AdministracionMediador a){
        unaVent.setLocationRelativeTo(null);
        unaVent.getjTextFieldCodigo().addKeyListener(new PresionarTecla());
        unaVent.getjTextFieldCodigo().setEditable(bandera);
        unaVent.getjButtonSeleccion().setEnabled(bandera);
        unaVent.getjButtonEliminar().setEnabled(bandera);
        unaVent.getjButtonDevolucion().setEnabled(bandera);
        admin = a;
        this.nombreUser = nombreuser;
        dtmArticulos = new DefaultTableModel(datos, titulos);
        this.actualizarFecha();
        unaVent.setActionListeners(this);
        unaVent.setKeyListener(this);
        unaVent.show();
    }

    public void setVisible(boolean mostrar){
        unaVent.setVisible(mostrar);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==unaVent.getjRadioButtonContado()){
            tipopago = "Contado";
            bandera = true;
            unaVent.getjRadioButtonTargeta().setEnabled(false);
            unaVent.getjButtonSeleccion().setEnabled(bandera);
            unaVent.getjButtonEliminar().setEnabled(bandera);
            unaVent.getjButtonDevolucion().setEnabled(bandera);
            unaVent.getjTextFieldCodigo().setEditable(bandera);
            unaVent.getjTextFieldCodigo().grabFocus();
            
        }
        if (e.getSource()==unaVent.getjRadioButtonTargeta()){
            tipopago = "Tarjeta";
            bandera = true;
            unaVent.getjRadioButtonContado().setEnabled(false);
            unaVent.getjButtonSeleccion().setEnabled(bandera);
            unaVent.getjButtonEliminar().setEnabled(bandera);
            unaVent.getjButtonDevolucion().setEnabled(bandera);
            unaVent.getjTextFieldCodigo().setEditable(bandera);
            unaVent.getjTextFieldCodigo().grabFocus();
        }
        if(e.getSource()==unaVent.getjButtonSeleccion()){
            buscarCampo(unaVent.getjTextFieldCodigo().getText());
            this.actualizartexTotal();
            unaVent.getjTextFieldCodigo().setText("");
        }
        if (e.getSource()==unaVent.getjButtonEliminar()){
            int select = unaVent.getjTableSeleccionados().getSelectedRow();
            if (select != -1){
                dtmArticulos.removeRow(select);
                this.actualizartexTotal();
            } else {
                JOptionPane.showMessageDialog(null, "Debe seleccionar un elemento", "Error por seleccion nula", JOptionPane.ERROR_MESSAGE);
            }
        }
        if (e.getSource()== unaVent.getjButtonDevolucion()){
            realizarDevolucion();
            unaVent.dispose();
            unaVent.getjTextFieldCodigo().setText("");
            bandera = false;
            admin.ActualizarConStocMin();
            cantidad = 0;
            total = 0;
            tipopago = "";
            porsentaje = 0;
            unaVent.getButtonGroup1().clearSelection();
            unaVent.getjRadioButtonTargeta().setEnabled(true);
            unaVent.getjRadioButtonContado().setEnabled(true);
            unaVent.getjButtonSeleccion().setEnabled(bandera);
            unaVent.getjButtonEliminar().setEnabled(bandera);
            unaVent.getjButtonDevolucion().setEnabled(bandera);
            dtmArticulos = new DefaultTableModel(datos, titulos);
            unaVent.getjTableSeleccionados().setModel(dtmArticulos);


        }
        if (e.getSource()==unaVent.getjButtonCancelar()){
            unaVent.dispose();
            unaVent.getjTextFieldCodigo().setText("");
            bandera = false;
            admin.ActualizarConStocMin();
            cantidad = 0;
            total = 0;
            tipopago = "";
            porsentaje =0;
            unaVent.getButtonGroup1().clearSelection();
            unaVent.getjRadioButtonTargeta().setEnabled(true);
            unaVent.getjRadioButtonContado().setEnabled(true);
            unaVent.getjButtonSeleccion().setEnabled(bandera);
            unaVent.getjButtonEliminar().setEnabled(bandera);
            unaVent.getjButtonDevolucion().setEnabled(bandera);
            dtmArticulos = new DefaultTableModel(datos, titulos);
            unaVent.getjTableSeleccionados().setModel(dtmArticulos);
        }

    }

    public void actualizartexTotal(){
        int i = 0;
        total = 0;
        cantidad = 0;
        while (i<unaVent.getjTableSeleccionados().getRowCount()){
            total = total + Double.parseDouble(unaVent.getjTableSeleccionados().getValueAt(i, 6).toString());
            cantidad = cantidad + Integer.parseInt(unaVent.getjTableSeleccionados().getValueAt(i, 4).toString());
            i = i +1;
        }
        unaVent.getjTextPaneTotal().setText(total+"");
    }

    public void actualizarFecha() {
        try {
            unaVent.getjTextPaneFecha().setText(Date.class.newInstance().toLocaleString());
        } catch (InstantiationException ex) {
            Logger.getLogger(MedDevolucion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(MedDevolucion.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void realizarDevolucion(){
        if(-1 == (unaVent.getjTableSeleccionados().getRowCount()-1)){
            JOptionPane.showMessageDialog(null, "NO Se ha realizado una venta", "Seleccion nula", JOptionPane.WARNING_MESSAGE);
        }else{
            Statement st;
            conectar.conectar();
            try {
                    st = conectar.getConn().createStatement();
                    String consulta = "SELECT Max(\"IDDevolucion\") FROM \"Devolucio\";";
                    String insertar;
                    ResultSet rs = st.executeQuery(consulta);
                    String in = "";
                    while (rs.next()){
                        in = rs.getString(1);
                    }

                    int a = Integer.parseInt(in)+1;
                    String aa = Double.toString(total);
                    int b = cantidad;
                    String c = unaVent.getjTextPaneFecha().getText();
                    String d = tipopago;//tipo de pago
                    String ee = nombreUser;//poner usuario de turno
                    insertar = "INSERT INTO \"Devolucio\"(\"IDDevolucion\", \"Total\", \"CantArticulo\", \"Fecha\", \"TipoPago\", \"Usuario\") VALUES ("+a+","+aa+","+b+",'"+c+"','"+d+"','"+ee+"')";
                    st.execute(insertar);
                    //--------------------------------------------------------
                    int i = unaVent.getjTableSeleccionados().getRowCount()-1;

                    while (i>=0){
                        String raa = unaVent.getjTableSeleccionados().getValueAt(i, 0).toString();
                        int can = Integer.parseInt(unaVent.getjTableSeleccionados().getValueAt(i, 4).toString());
                        sumarBase(raa , can);
                        insertar = "INSERT INTO \"FacturacionDev\"(\"IDDevolucion\", \"CodigoArt\", \"Cant\") VALUES ("+a+", '"+raa+"',"+can+")";
                        st.execute(insertar);
                        dtmArticulos.removeRow(i);
                        i= i-1;
                    }
                    //--------------------------------------------------------
                    JOptionPane.showMessageDialog(null, "Codigo: "+a, "Se ha dado de alta la devolucion", JOptionPane.INFORMATION_MESSAGE);

            } catch (SQLException ex) {
                    ex.printStackTrace();
                    JOptionPane.showMessageDialog(null, "Nose puede realizar la venta", "ERROR", JOptionPane.ERROR_MESSAGE);
            }

            conectar.cerrar();
        }
    }

    public void sumarBase(String cod , int cant){
        conectar.conectar();
        try {
            Statement st;
            st = conectar.getConn().createStatement();
            String consulta = "SELECT \"Stock\" FROM \"Articulo\" WHERE \"codArt\"='"+cod+"';";
            String insertar;
            ResultSet rs = st.executeQuery(consulta);
            String in = "";
            while (rs.next()){
                in = rs.getString(1);
            }
            int a = Integer.parseInt(in)+cant;
            String modifica = "UPDATE \"Articulo\" SET \"Stock\"="+a+" WHERE \"codArt\" = '"+cod+"';";
            st.execute(modifica);
            st.close();
        } catch (SQLException ex) {
                ex.printStackTrace();
                JOptionPane.showMessageDialog(null, "Nose pudo actualizar base de dato", "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        conectar.cerrar();
    }

    public void buscarCampo(String cod){
        conectar.conectar();
        Statement st;
        try {
            st = conectar.getConn().createStatement();
            String consulta = "SELECT * FROM \"Articulo\" WHERE \"codArt\" = '"+cod+"';" ;
            String consulta1 = "SELECT * FROM \"TipoPago\" WHERE \"Tipo\" = '"+tipopago+"';";
            ResultSet rs = st.executeQuery(consulta1);

            while (rs.next()){
                porsentaje = rs.getDouble(2);
            }
            rs = st.executeQuery(consulta);
            String id = null;

            if(cantidad==0){
               while (rs.next()){
                    Object[] fila = {rs.getString("codArt"),
                    rs.getString("nombre"),
                    rs.getString("marca"),
                    rs.getString("descripcion"),
                    1,
                    Math.rint(rs.getDouble("precioCosto")*porsentaje),
                    Math.rint(rs.getDouble("precioCosto")*porsentaje)};
                    dtmArticulos.addRow(fila);
                    cantidad = 1;
                }
            }else{
                int ind = buscarcodTbl(cod,unaVent.getjTableSeleccionados().getRowCount()-1);
                System.out.println(ind);
                if(ind!=-1){     
                   unaVent.getjTableSeleccionados().setValueAt(Integer.parseInt(unaVent.getjTableSeleccionados().getValueAt(ind, 4).toString())+1, ind,4 );
                   unaVent.getjTableSeleccionados().setValueAt(Double.parseDouble(unaVent.getjTableSeleccionados().getValueAt(ind, 5).toString())*Integer.parseInt(unaVent.getjTableSeleccionados().getValueAt(ind, 4).toString()), ind,6 );
                }else{
                    System.out.println("entre");
                    while (rs.next()){
                        Object[] fila = {rs.getString("codArt"),
                        rs.getString("nombre"),
                        rs.getString("marca"),
                        rs.getString("descripcion"),
                        1,
                        Math.rint(rs.getDouble("precioCosto")*porsentaje),
                        Math.rint(rs.getDouble("precioCosto")*porsentaje)};
                            dtmArticulos.addRow(fila);
                        
                    }
                    
                }

            }
        } catch (Exception e){
            e.printStackTrace();
        }
        conectar.cerrar();
        unaVent.getjTableSeleccionados().setModel(dtmArticulos);
    }

    public int buscarcodTbl(String cod, int i){
        if (i==-1){
            return -1;
        }else{
            
            if (unaVent.getjTableSeleccionados().getValueAt(i, 0).toString().matches(cod)){
                System.out.println(unaVent.getjTableSeleccionados().getValueAt(i, 0).toString()+"-"+cod+"si"+i);
                return i;
            }else{
                System.out.println(unaVent.getjTableSeleccionados().getValueAt(i, 0).toString()+"-"+cod+"no"+i);
                return  + buscarcodTbl( cod, i-1);
            }
        }
    }

    public void keyTyped(KeyEvent e) {
        if (e.getSource()== unaVent.getjTextFieldCodigo()){
            char caracter = e.getKeyChar();
            if((caracter == '$')){
                e.consume();
            }
        }
    }

    public void keyPressed(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }

    private int hayStock(String cod) {
        conectar.conectar();
        String in = "";
        try {
            Statement st;
            st = conectar.getConn().createStatement();
            String consulta = "SELECT \"Stock\" FROM \"Articulo\" WHERE \"codArt\"='"+cod+"';";
            String insertar;
            ResultSet rs = st.executeQuery(consulta);

            while (rs.next()){
                in = rs.getString(1);
            }
            st.close();
        } catch (SQLException ex) {
                ex.printStackTrace();
                JOptionPane.showMessageDialog(null, "error", "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        conectar.cerrar();
        return Integer.parseInt(in);
    }

    public class PresionarTecla extends KeyAdapter {

      public void keyPressed(KeyEvent ke) {
          if (ke.getKeyCode() == KeyEvent.VK_ENTER) {
              seleccionarArt(null);
          }
      }

        private void seleccionarArt(Object object) {
            buscarCampo(unaVent.getjTextFieldCodigo().getText());
            actualizartexTotal();
            unaVent.getjTextFieldCodigo().setText("");
        }




    }
}